package com.itheima.leetcode.od.b.violentenumeration;

import java.util.Arrays;

/**
 * (A卷,100分)- 简单的自动曝光、平均像素值（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 一个图像有n个像素点，存储在一个长度为n的数组img里，每个像素点的取值范围[0,255]的正整数。
 * 请你给图像每个像素点值加上一个整数k（可以是负数），得到新图newImg，使得新图newImg的所有像素平均值最接近中位值128。
 * 请输出这个整数k。
 * <p>
 * 输入描述
 * <p>
 * n个整数，中间用空格分开
 * <p>
 * 输出描述
 * <p>
 * 一个整数k
 * <p>
 * 备注
 * • 1 <= n <= 100
 * • 如有多个整数k都满足，输出小的那个k；
 * • 新图的像素值会自动截取到[0,255]范围。当新像素值<0，其值会更改为0；当新像素值>255，其值会更改为255；
 * <p>
 * 例如newImg=”-1 -2 256″,会自动更改为”0 0 255″
 * <p>
 * 用例
 * <p>
 * 输入	0 0 0 0
 * 输出	128
 * 说明	四个像素值都为0
 * <p>
 * 输入	129 130 129 130
 * 输出	-2
 * 说明	-1的均值128.5，-2的均值为127.5，输出较小的数-2
 */
public class AveragePixelValue {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();*/

        String str = "129 130 129 130";
        Integer[] arr = Arrays.stream(str.split(" "))
                .map(Integer::parseInt)
                .toArray(Integer[]::new);

        System.out.println(getResult(arr));
    }

    public static int getResult(Integer[] arr) {
        int len = arr.length;
        double minDiff = Integer.MAX_VALUE;
        Integer ans = null;

        for (int k = -127; k <= 128; k++) {
            double sum = 0;
            for (Integer val : arr) {
                int newVal = val + k;
                // 新图的像素值会自动截取到[0,255]范围。当新像素值<0，其值会更改为0；当新像素值>255，其值会更改为255；
                newVal = Math.max(0, Math.min(newVal, 255));
                sum += newVal;
            }

            double diff = Math.abs(sum / len - 128);

            if (diff < minDiff) {
                minDiff = diff;
                ans = k;
            } else if (diff == minDiff && ans != null) {
                // 如有多个整数k都满足，输出小的那个k
                ans = Math.min(ans, k);
            }
        }

        return ans;
    }
}